package com.axend.lib_room.dao

import androidx.lifecycle.LiveData
import androidx.room.Dao
import androidx.room.Delete
import androidx.room.Insert
import androidx.room.OnConflictStrategy
import androidx.room.Query
import androidx.room.Update
import com.axend.lib_room.entity.PetInfoEntity
import com.axend.lib_service.Constant.TABLE_PET_LIST

/**
 *定义数据操作的方法，增删改查 一般为interface
 * 注意:下面的函数确保要正确，否则会出现不可预知问题
 */
@Dao
interface PetInfoDao {


    /**
     * 插入单条数据
     */
    @Insert(entity = PetInfoEntity::class, onConflict = OnConflictStrategy.REPLACE)
    suspend fun insert(petInfoEntity: PetInfoEntity)


    /**
     * 插入多条数据
     */
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    suspend fun insertAll(petInfoEntityList: List<PetInfoEntity>)

    /**
     * 根据id删除数据
     */
    @Query("DELETE FROM $TABLE_PET_LIST WHERE id = :id")
    suspend fun deleteById(id: Int)


    /**
     *删除指定item
     * 使用主键将传递的实体实例与数据库中的行进行匹配。如果没有具有相同主键的行，则不会进行任何更改
     */
    @Delete
    suspend fun delete(petInfoEntity: PetInfoEntity)


    /**
     * 删除表中所有数据
     */
    @Query("DELETE FROM $TABLE_PET_LIST")
    suspend fun deleteAll()


    /**
     * 更新某个item
     *  不指定的entity也可以，会根据你传入的参数对象来找到你要操作的那张表
     */
    @Update
    suspend fun update(petInfoEntity: PetInfoEntity)


    /**
     * 根据id更新数据
     */
    @Query("UPDATE $TABLE_PET_LIST SET petNickName = :petNickName,species = :species,breed = :breed WHERE id = :id")
    suspend fun updateById(id: Int, petNickName: String, species: String, breed: String)


    /**
     * 查询所有数据
     */
    @Query("SELECT * FROM $TABLE_PET_LIST")
    suspend fun getAll(): MutableList<PetInfoEntity>?


    /**
     * 根据id查询某个数据
     */
    @Query("SELECT * FROM $TABLE_PET_LIST WHERE id = :id")
    suspend fun getById(id: Int): PetInfoEntity?

    /**
     * 根据名称查询数据
     */
    @Query("SELECT * FROM $TABLE_PET_LIST WHERE petNickName = :petNickName")
    suspend fun getByName(petNickName: String): PetInfoEntity?

    /**
     * 通过LiveData以观察者的形式获取数据库数据，可以避免不必要的NPE，
     * 可以监听数据库表中的数据的变化，也可以和RXJava的Observer使用
     * 一旦发生了insert，update，delete，room会自动读取表中最新的数据，发送给UI层，刷新页面
     * 不要使用MutableLiveData和suspend 会报错
     */
    @Query("SELECT * FROM $TABLE_PET_LIST")
    fun getAllLiveData(): LiveData<List<PetInfoEntity>>?


    /**
     * 根据name、masterName、species、breed进行分页的模糊查询
     */
    @Query("SELECT * FROM $TABLE_PET_LIST WHERE petNickName LIKE '%' || :keyWords || '%' OR masterName LIKE '%' || :keyWords || '%' OR speciesValue LIKE '%' || :keyWords || '%' OR breed LIKE '%' || :keyWords || '%' ORDER BY id DESC LIMIT :pageSize OFFSET :offset")
    suspend fun getByName(keyWords:String,pageSize: Int, offset: Int): MutableList<PetInfoEntity>?

    /**
     * 根据name、masterName、species、breed进行分页的模糊查询的总条目
     */
    @Query("SELECT COUNT(*) FROM $TABLE_PET_LIST WHERE petNickName LIKE '%' || :keyWords || '%' OR masterName LIKE '%' || :keyWords || '%' OR speciesValue LIKE '%' || :keyWords || '%' OR breed LIKE '%' || :keyWords || '%'")
    suspend fun getByNameCount(keyWords:String): Int

    /**
     * 根据name、masterName、species、breed进行模糊查询所有数据
     */
    @Query("SELECT * FROM $TABLE_PET_LIST WHERE petNickName LIKE '%' || :keyWords || '%' OR masterName LIKE '%' || :keyWords || '%' OR speciesValue LIKE '%' || :keyWords || '%' OR breed LIKE '%' || :keyWords || '%'")
    suspend fun getByNameAll(keyWords:String): MutableList<PetInfoEntity>?


    /**
     * 获取所有数据分页查询
     */
    @Query("SELECT * FROM $TABLE_PET_LIST LIMIT :pageSize OFFSET :offset")
    suspend fun getAllByPage(pageSize: Int, offset: Int): MutableList<PetInfoEntity>?

}